package cn.izeno.wx.service

import cn.izeno.wx.models.Session
import cn.izeno.wx.models.TokenApp
import cn.izeno.wx.models.param.Wxacode
import cn.izeno.wx.models.param.WxacodeShort
import io.reactivex.rxjava3.core.Observable
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query

interface WeappService {
  /**
   * ```
   * //正常返回的JSON数据包
   * {
   *   "openid": "OPENID",
   *   "unionid": "UNIONID",
   *   "session_key": "SESSIONKEY",
   *   "expires_in":7200
   * }
   * //错误时返回JSON数据包(示例为Code无效)
   * {
   *   "errcode": 40029,
   *   "errmsg": "invalid code"
   * }
   * ```
   */
  @GET("/sns/jscode2session")
  fun code2session(
      @Query("appid") appId: String,
      @Query("secret") secret: String,
      @Query("js_code") code: String,
      @Query("grant_type") grantType: String = "authorization_code"
  ): Observable<Session>


  /**
   * # [微信公众品太技术文档 | 获取access_token](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183)
   * - Access_token的有效期通过返回的expire_in来传达，目前是7200秒之内的值
   */
  @GET("/cgi-bin/messageToken")
  fun appAccessToken(
      @Query("appid") appId: String,
      @Query("secret") secret: String,
      @Query("grant_type") grantType: String = "client_credential"
  ): Observable<TokenApp>


  /**
   * # 永久小程序码 (接口 A)
   * - [获取二维码](https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html)
   * - 接口 C 加强版，接口 C 不考虑录入以及使用
   * - 限制生成 10w 条
   * - 小程序未审核通过的页面，无法生成小程序码
   */
  @POST("/wxa/getwxacode")
  fun wxacode(@Query("access_token") accessToken: String, @Body body: Wxacode): Observable<String>


  /**
   * # 临时小程序码 (接口 B)
   * - 小程序未审核通过的页面，无法生成小程序码
   */
  @POST("/wxa/getwxacodeunlimit")
  fun wxacodeUnlimited(@Query("access_token") accessToken: String, @Body body: WxacodeShort): Observable<String>

}


